#include "package.h"
//解包
//校验CRC之后 取出指令 和参数放到对应的变量中
//并且将参数的长度通过返回值传出
/***********************************
*函数名称： PACKAGE_UnpackData
*函数功能： 将要接收到的数据包解开
*输入参数： cmd 保存命令的变脸地址  parameter保存参数的变量的首地址
*输出参数： none
返回值：	参数的长度
**********************************/
int PACKAGE_UnpackData(uint16_t *cmd,uint16_t *parameter)
{
	uint8_t receive[PACKAGE_RCVBUF_SIZE]	=	{0};
	//定义一个int型指针指向receive
	uint16_t* preceive=	(uint16_t*)receive;
	//接收缓存中数据量
	uint16_t lenth	=	RAM_GetDataLenthOfRcvBuf();
	//将数据包取出并存到缓存中
	for(uint16_t i = lenth;i > 0;i--)
	{
		//从rcvbuf取出数据
		receive[i - 1]	=	RAM_TakeOutDataFromRcvBuf();
	}
	//取出CRC 并且校验
	uint16_t crc	=	(((uint16_t)(receive[lenth - 1]) << 8) | (uint16_t)(receive[lenth - 2]));
	//长度去掉CRC
	lenth	-=	2;
	//清指令和参数
	CMD_CleanCMDAndParameterBuf();
	//取出指令  和 参数放到 对应的变量中
	if(CRC_VerfyPackage(receive,lenth,crc)	!=	0)
	{
		//取命令
		*cmd	=	preceive[0];
		//重新计算长度 lenth 需要减去命令 的2个byte 除以2得到int 型的参数个数
		lenth	=	(lenth - 2) / 2;
		//取参数
		for(uint16_t i = 0;i < lenth;i++)
			parameter[i]	=	preceive[i + 1];
		//返回参数的长度
		return	lenth;
	}
	//如果校验失败 命令为0
	else	
	{
		//如果校验失败则清空命令和参数的缓存 并且返回负数
		CMD_CleanCMDAndParameterBuf();
		return	-1;
	}
}

//封装包
//首先是外部讲一个buf 中lenth个数据传到该函数 
//然后这个函数将按照格式将数据保存sendbuf中
/***********************************
*函数名称： PACKAGE_PackData
*函数功能： 将要发送的数据打包
*输入参数： buf要发送的数据缓存  lenth要发送的数据长度
*输出参数： none
**********************************/
void PACKAGE_PackData(uint16_t* buf , uint16_t lenth)
{
	uint16_t send[PACKAGE_SENDBUF_SIZE]	=	{0};
	//将要发送部分数据放到send中
	for(uint16_t i = 0;i < lenth;i++)
		send[i]	=	buf[i];
	//先做CRC校验 将crc放到后一位
	send[lenth]	=	CRC_GetCRCOfPackage(send,lenth);
	//将数据放到发送buf 多了一个crc所以长度加1
	RAM_SavePackageToSendBuf(send,lenth + 1);	
}





